//引入ejs
import adminListView from '$v/adminList'

//引入接口
import {
  addAdminRequest,
  adminListRequest,
  deleteAdminRequest,
  isLoginRequest
} from "$a/admin"
// import { Router } from 'express'

//封装展示所有管理员列表功能的函数,当初始化/添加/删除的时候,重新渲染页面
//此函数为异步函数
const showAdminList = async (res) => {
  //只要进入当前路由,则立马查询所有的管理员信息
  //trycatch中为异步函数,必须先执行此异步,才能渲染页面
  let adminListResult = null
  try {
    //如果直接在内部声明常量,则渲染是无法获取请求的数据,所以需要在上层作用域声明
    adminListResult = await adminListRequest()
    // console.log(adminListResult);
  } catch (e) {
    alert("获取管理员列表异常" + e.message)
    //判断是否是权限异常
    console.log(e);
    if(!e.isLogin){
      //r小写
      return router.go("/login")
    }
  }
  //渲染二级路由视图,并接收从数据库查询到的数据
  res.render(adminListView({
    adminList: adminListResult
  }));
}

export default async (req, res) => {
  //权限验证
  try{
    await isLoginRequest()
  }catch(e){
    alert("有异常" + e.message)

    //判断是否是权限异常
    if(!e.isLogin){
      return router.go("/login");
    }
  }
  

  //必须要在调用的异步函数全部执行完之后,才能继续向下执行
  //一进页面就获取数据库中已存在的管理员列表
  await showAdminList(res)
  //在sem路由中,在路由的回调函数中可以获取整个document,所以我们可以在这个位置操作DOM

  //添加管理员功能
  //给保存按钮绑定点击事件,添加管理员
  const oSaveAdminBtn = document.getElementById('saveAdminBtn');
  //事件委派????,使新增列表拥有旧列表的所有功能
  document.onclick = async function (e) {
    //添加管理员点击逻辑,点击保存按钮自动重新渲染视图
    if (e.target.id === "saveAdminBtn") {
      //可以通过表单元素的name属性获取某个元素
      // console.log(document.adminForm);
      // console.log(document.adminForm.adminName);
      // console.log(document.adminForm.password);
      // console.log(document.adminForm.rePassword);
      //获取用户输入的内容
      const adminNameValue = document.adminForm.adminName.value.trim();
      const passwordValue = document.adminForm.password.value.trim();
      const rePasswordValue = document.adminForm.rePassword.value.trim();

      //判断所有的输入不能为空
      if (!adminNameValue || !passwordValue || !rePasswordValue) {
        return alert("输入内容不能为空!!!!");
      }

      //判断密码是否一致
      if (passwordValue !== rePasswordValue) {
        return alert("两次输入的密码不一致")
      }

      //向后端发送添加管理员请求
      try {
        await addAdminRequest({
          adminName: adminNameValue,
          password: passwordValue,
          regTime: new Date().toLocaleString()
        })

        alert("添加成功")
        //添加成功之后,管理添加窗口(手动触发某个元素上的点击事件)
        document.getElementById('clossAdd').click();
        //清空表单
        document.adminForm.reset();
        //重新渲染新增加的管理员列表
        showAdminList(res)
      } catch (e) {
        //请求异常后提示用户
        alert("有异常" + e.message)
        //清空表单
        document.adminForm.reset();

        //判断是否是权限异常
        if (!e.isLogin) {
          return router.go("/login");
        }
      }

    }

    //删除管理员逻辑
    if(e.target.nodeName === "BUTTON" && e.target.parentNode.nodeName === "TD"){
      //获取当前删除按钮对应的adminName(在生成删除按钮时,给按钮自定义属性保存adminName的值)
      const adminName = e.target.dataset.adminname
      // console.log(adminName);

      //发送删除请求
      try{
        await deleteAdminRequest(adminName)
        alert("删除管理员" + adminName + "成功")
        // 自动重新渲染视图
        showAdminList(res)
      }catch(e){
        alert("删除管理员" + adminName + "异常")

        if (!e.isLogin) {
          return router.go("/login");
        }
      }
    }

  }
}